package com.hhz.lambda.part3;

import com.hhz.lambda.part1.Employee;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * Lambda 表达式的练习
 *
 * @Author Rem
 * @Date 2020-02-10
 */

public class TestLambda3 {


    List<Employee> employees = Arrays.asList(
            new Employee("张三", 16, 3468.12),
            new Employee("李四", 42, 9485.32),
            new Employee("王五", 24, 8482.99),
            new Employee("赵六", 33, 6381.82),
            new Employee("田七", 36, 4448.45),
            new Employee("方八", 36, 7485.42)
    );

    //1.使用Collections.sort() 比较两个Employee(先按年龄 年龄相同按姓名)
    @Test
    public void compare() {
        employees.sort((emp1, emp2) -> {
            if (emp1.getAge() == emp2.getAge()) {
                return emp1.getName().compareTo(emp2.getName());
            } else {
                //倒序
                return -Integer.compare(emp1.getAge(), emp2.getAge());
                // return Integer.compare(emp1.getAge(), emp2.getAge());
            }
        });
        employees.forEach(System.out::println);
    }

    //2. a声明函数式接口 抽象方法 String getValue(String str);
    //   b声明类 类中编写方法使用接口作为参数 将第一个字符换成大写，并作为方法的返回值
    @Test
    public void tranc() {
        String hello = strHander("hello", str -> str.substring(0, 1).toUpperCase() + str.substring(1));
        System.out.println(hello);
    }

    public String strHander(String str, CutString cc) {
        return cc.getValue(str);
    }

    //3 声明一个带两个泛型的函数式接口 <T,R> T为参数 R为返回值
    // 计算两个long类型参数的和  再计算两个参数的乘积


    @Test
    public void calc() {
        Long count = calculate(3L, 4L, (a, b) -> a + b);
        Long multifly = calculate(3L, 4L, (a, b) -> a * b);

        System.out.println(count);
        System.out.println(multifly);
    }


    public Long calculate(Long l1, Long l2, MyFunction<Long, Long> mf) {
        return mf.Calc(l1, l2);
    }

}
